package ausgabeUndDatenverwaltung;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;

import hilfsklassen.*;

/**
 * Bekommt ein Ausgabelisten Objekt uebergeben. Dieses
 * Ausgabelisten Objekt wird ueber diese Klasse ausgegeben. Diese Klasse
 * kuemmert sich somit um die Ausgabe und Speicherung der Listen auf dem
 * Dateisystem.
 * 
 * @author (Max Bogner)
 * @version (14.01.2014)
 */
public class OutputErzeuger {

	// Diese Attribute werden fuer die Speicherung der Dateien auf der
	// Festplatte benoetigt
	private Datei AusgabeDateiNotenListe;
	private Datei AusgabeDateiAnwesenheitsListe;
	private Datei AusgabeDateiPruefungsPlan;
	private Datei AusgabeDateiPlatzkartenListe;
	private Datei Allrounder;
	// Dieses Attribute enthaelt den Pfad unter dem die Dateien gespeichert
	// werden sollen
	private String AusgabePfad;
	// Diese Attribute enthalten die Dateinamen unter welchem die Dateien
	// abgespeichert werden
	private String AusgabenDateiNameNotenListe;// = "Notenliste";
	private String AusgabenDateiNameAnwesenheitsListe;//
	private String AusgabenDateiNamePruefungsPlan; // = "Pruefungsplan";
	private String AusgabendateiNamePlatzkartenListe; // = "Platzkartenliste";

	/**
	 * Konstruktur zum Erzeugen von Objekten vom Typ OutputErzeuger.
	 */
	public OutputErzeuger() {
		// initialise instance variables
		//AusgabePfad = "C:/";
		AusgabenDateiNameNotenListe = "Notenliste";
		AusgabenDateiNameAnwesenheitsListe = "Anwesenheitsliste";
		AusgabenDateiNamePruefungsPlan = "Pruefungsplan";
		AusgabendateiNamePlatzkartenListe = "Platzkartenliste";

	}


	/**
	 * Diese Methode speichert die Ausgabedateien auf dem Dateisystem und gibt
	 * eine Statusmeldung zurueck.
	 * @author max bogner
	 * @param ausgabeliste
	 *            beinhaltet alle Listen, die ausgegeben werden sollen
	 * @return Statusmeldung War das speichern erfolgreich?
	 * 
	 */
	public boolean speichereAufDateiSystem(AusgabeListen ausgabeliste) {
		// uebergibt die Notenliste zum speichern im Dateisystem in VectorToFile
		Vector nl = new Vector();
		nl = ausgabeliste.getNotenliste().getNotenliste();
		// kann nachdem die Notenliste technisch umgesetzt wurde wieder
		// rausgenommen werden:
		//Object o = new Object();
		//nl.add(o);
		//
		VectorToFile(nl, 1, "");

		// uebergibt die Pruefungsplaene zum speichern im Dateisystem in
		// VectorToFile
		Vector ppl = new Vector();
		ppl = ausgabeliste.getPruefungsplan().getPruefungsplan();
		VectorToFile(ppl, 2, "");

		// uebergibt die Anwesenheitsliste zum speichern im Dateisystem in
		// VectorToFile
		// fuer jede uni und pro tag muss eine anwesenheitsliste geschrieben
		// werden --> daher die Aufteilung
		Vector<AnwesenheitsListe> val = new Vector<AnwesenheitsListe>();
		val = ausgabeliste.getAnwesenheitslistenprotagunduni();
		for (int i = 0; i < val.size(); i++) {
			Vector awl = new Vector();
			awl = val.elementAt(i).getAnwesenheitsliste();
			String str = val.elementAt(i).getUniversitaet() + "_"
					+ val.elementAt(i).getPruefungstag();
			VectorToFile(awl, 3, str);
		}

		// uebergibt die Platzkartenliste zum speichern im Dateisystem in
		// VectorToFile
		Vector<PlatzKarte> pkl = new Vector<PlatzKarte>();
		pkl = ausgabeliste.getPlatzkartenliste().getPlatzkartenliste();
		VectorToFile(pkl, 4, "");

		return true;
	}

	/**
	 * Speichert den uebergebenen Vector in eine Datei. Dies geschieht je nach
	 * gesetzten type. Fuer den uebergebenen Vector wird anhand der toString
	 * Methode der Stringoutput fuer die Textdatei ermittelt.
	 * @author: max bogner
	 * @param vec
	 *            : Vector der in die Datei geschrieben wird
	 * @param type
	 *            : Gibt den Typ des Vectors an der gespeichert werden soll:
	 *            1=Notenliste, 2=Pruefungsplan, 3=Anwesenheitsliste,
	 *            4=Platzkartenliste
	 * @param dateinamenerweiterung
	 *            : Der Dateiname wird um diesen String erweitert
	 * @return Statusmeldung War das speichern erfolgreich?
	 * 
	 */
	public boolean VectorToFile(Vector vec, int type,
			String dateinamenerweiterung) {
		
		String output_str = "";
		//ermittelt welcher typ uebergeben wurde
		switch (type) {
		case 1: // NotenListe:
			Allrounder = new Datei(AusgabenDateiNameNotenListe
					+ dateinamenerweiterung);
			NotenListe n = new NotenListe();
			n.setNotenliste(vec);
			//erstellt den benoetigten Output als String
			output_str = n.toString();
			break;
		case 2: // PruefungsterminPlan:
			Allrounder = new Datei(AusgabenDateiNamePruefungsPlan
					+ dateinamenerweiterung);
			PruefungsterminPlan pp = new PruefungsterminPlan();
			pp.setPruefungsplan(vec);
			//erstellt den benoetigten Output als String
			output_str = pp.toString();
			break;
		case 3: // AnwesenheitsListe:
			Allrounder = new Datei(AusgabenDateiNameAnwesenheitsListe
					+ dateinamenerweiterung);
			AnwesenheitsListe awl = new AnwesenheitsListe();
			awl.setAnwesenheitsliste(vec);
			//erstellt den benoetigten Output als String
			output_str = awl.toString();
			break;
		case 4: // Platzkartenliste:
			Allrounder = new Datei(AusgabendateiNamePlatzkartenListe
					+ dateinamenerweiterung);
			PlatzKartenListe p = new PlatzKartenListe();
			p.setPlatzkartenliste(vec);
			//erstellt den benoetigten Output als String
			output_str = p.toString();
			break;
		default:
			break;
		}

		// Oeffnen der Ausgabedatei
		Allrounder.openOutFile_FS();
		if (!Allrounder.state()) {
			String errStr = new String();
			errStr = "Fehler: Beim Oeffnen der Ausgabedatei.";
			System.out.println(errStr);
			return false;
		}
		// ueberprueft ob der vector elemente enthaelt

		if ((vec.size()) > 0) {
			// schreibt den oben erstellten string in die Ausgabedatei
			Allrounder.writeLine_FS(output_str);

		} else {
			// Vector ist leer
			System.out
					.println("Fehler: Es sind keine Element in der Liste vorhanden. Save gescheitert.");
			return false;
		}
		// schließt die Ausgabedatei
		Allrounder.closeOutFile_FS();
		if (!Allrounder.state()) {
			System.out.println("Fehler: Beim Schliessen der Ausgabedatei.");
			return false;
		}
		return true;
	}
	
	/**
	 * Datei schreiben mit Angabe des Pfades vom Filechooser und 
	 * mit dem uebergebenen String der toString Methoden.
	 * 
	 * @autor: Kerstin Schulze
	 * 
	 * @param pfad (String) Dateipfad des Filechoosers
	 * @param zk (String) erzeugte Strings der ToString Methoden
	 */
	public void dateiSchreiben(String pfad, String zk) {
		String s = zk;
		try {
			BufferedWriter b = new BufferedWriter(new FileWriter(pfad));			
				b.write(s);
				b.newLine();
			    b.close();
		} catch (IOException e) {
			System.out.println("Fehler: " + e.toString());
		}
	}
	

}
